package com.hn.zhijian.base.common.converter;

import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.web.ResourceProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.*;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import java.nio.charset.StandardCharsets;
import java.util.List;





/**
 * @author carl chen
 * @Classname FastJsonConfigure
 * @Description FastJson配 问题
 * 2种方式实现统一返回处理：1.继承父类WebMvcConfigurationSupport 2、继承接口WebMvcConfigurer
 * 1.WebMvcConfigurationSupport方式
 *   继承该父类，等于完全重写springboot的Configure的机制，目前已知是，返回解析方式（我使用的是fastjson，系统默认是jackJson），
 *   但是有个缺陷，因为重写了所以，springboot的默认配置也没了，就会造成就是所有的静态资源都会找不到比如，resources/public
 *   resources/static文件都直接访问不了，只有重写addResourceHandlers方法，手动在添加一次，才能生效，但是不知道还有什么默认设置被干掉默认加载
 *   HttpMessageConverter有10个。我自定义后只有1个，可怜！！！！有个StringHttpMessageConverter是个大坑，RestController,ResponseBody注解，直接返回String就会报错xx
 *   对象转成string错误。
 *  2.WebMvcConfigurer
 *   我是一个比较纠结的人，要我自己重新写静态资源路径还有一些默认东西， 总感觉不舒服，通过调试源码了解到，他还有个WebMvcConfigurer,他的执行顺序，
 *   是在WebMvcConfigurationSupport.configureMessageConverters之前，我灵机一动，通过调试，我发现他进来这里是已经有10个Converter的，那么这就很
 *   好解决路径问题了，我只需要在converters加上自己配置，然后删除不需要的，这里重点强调，必须要删除StringHttpMessageConverter，至于为什么看第一条
 *   里面还有jackJson的配置，可以删除也可以不删除 ，目前没又发现有什么错误。
 * @Date 2019/10/30 11:54
 */
/**
 * @author carl chen
 * @Classname FastJsonConfigure
 * @Description FastJson配 问题
 * @Date 2019/10/30 11:54
 */
@Configuration
@Slf4j
public class WebMvcConfiguration extends WebMvcConfigurationSupport {
    @Autowired
    private ResourceProperties resourceProperties;
    /**
     * 使用阿里 fastjson 作为 JSON MessageConverter
     *
     * @param converters
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter converter = new ApplicationJsonHttpMessageConverter();
//        FastJsonConfig config = new FastJsonConfig();
//        config.setSerializerFeatures(
//                // 保留 Map 空的字段
//                SerializerFeature.WriteMapNullValue,
//                // 将 String 类型的 null 转成""
//                SerializerFeature.WriteNullStringAsEmpty,
//                // 将 Number 类型的 null 转成 0
//                SerializerFeature.WriteNullNumberAsZero,
//                // 将 List 类型的 null 转成 []
//                SerializerFeature.WriteNullListAsEmpty,
//                // 将 Boolean 类型的 null 转成 false
//                SerializerFeature.WriteNullBooleanAsFalse,
//                // 避免循环引用
//                SerializerFeature.DisableCircularReferenceDetect);
//        //转换日期格式
//        config.setDateFormat(DateUtils.YYYY_MM_DD_HH_MM_SS);
        //配置加入容器
        converter.setFastJsonConfig(ApplicationJsonHttpMessageConverter.getCustomizeFastJsonConfig());
        converter.setDefaultCharset(StandardCharsets.UTF_8);
        converters.add(converter);
        super.addDefaultHttpMessageConverters(converters);
    }


    /**
     * 发现如果继承了WebMvcConfigurationSupport，则在yml中配置的相关内容会失效。 需要重新指定静态资源
     *
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**")
                .addResourceLocations(resourceProperties.getStaticLocations());
        super.addResourceHandlers(registry);
    }

//    /**
//     * 配置servlet处理 前后端分离这里要取消掉
//     */
//    @Override
//    public void configureDefaultServletHandling(
//            DefaultServletHandlerConfigurer configurer) {
//        configurer.enable();
//    }


}
